/***************************************
 * 说明：本文件主要列举课后习题
 * *************************************/
#include <iostream>
#include <string>
#include <string.h>
#include <algorithm>
#include <set>
using namespace std;

/***************************************
 * 习题1.1：分析程序的运行结果
 * *************************************/
void exercise1()
{
    cout << "this" << "is";
    cout << "c++";
    cout << "programe" << endl;
}

/***************************************
 * 习题1.2：分析程序的运行结果
 * *************************************/
void exercise2()
{
    int a,b,c;
    a = 10;
    b = 23;
    c=a+b;
    cout << "a+b=";
    cout <<c;
    cout << endl;
}

/***************************************
 * 习题1.3：分析程序的运行结果
 * *************************************/
int f(int x, int y, int z)
{
    int m;
    if (x <= y) {
        m = y;
    } else {
        m = x;
    }
    if (z < m) {
        m = z;
    }
    return m;
}
void exercise3()
{
    int a,b,c;
    cin >> a >> b >> c;
    c = f(a, b, c);
    cout << c << endl;
}

/*************************************************
 * 习题1.4：输入以下程序，进行编译，如果遇到错误请更改
 * ***********************************************/
void exercise4()
{
    int a,b;
    int c = a + b; //要对C进行定义int c = a+b;
    // 输出流cout的插入符是<<; cout << "a+b=" <<a+b  并且a/b并未输入数值
    cout << "a+b=" << a+b; 
}
/*************************************************
 * 习题1.5：输入以下程序，进行编译，如果遇到错误请更改
 * ***********************************************/
int add(int x, int y)
{
    int z = x + y;
    return z;
}
void exercise5()
{
    int a, b;
    cin >> a >> b;
    int c = add(a, b);
    cout << "a+b=" << c << endl;
}

/*************************************************
 * 习题1.6：输入以下程序，进行编译，并分析运行结果
 * ***********************************************/
void exercise6()
{
    void sort(int a, int b, int c);
    int x,y,z;
    cin >> x >> y >> z;
    sort(x,y,z);
}
void sort(int x, int y, int z)
{
    int temp;
    // x <= y
    if(x > y) {
        int temp = x;
        x = y;
        y = temp;
    }
    if (z < x) {
        cout << z << " " << x << " " << y << endl;
    } else if (z <= y) {
        cout << x << " " << z << " " << y << endl;
    } else {
        cout << x << " " << y << " " << z << endl;
    }
}

/*************************************************
 * 习题1.7：求2个或者3个正整数中的最大数，
 * 用带有默认参数的函数实现
 * ***********************************************/
int exercise7(int a, int b, int c = 0)
{
    if (a < b) {
        int temp = a;
        a = b;
        b = a;
    }
    if (a < c) return c;
    else return a;
}

/*************************************************
 * 习题1.8：输入两个整数，将他们由大到小的顺序输出，
 * 要求使用变量的引用
 * ***********************************************/
void exercise8(int& a, int& b)
{
    if (a < b) {
        int temp = a;
        a = b;
        b = temp;
    }
    cout << a << b << endl;
}

/*************************************************
 * 习题1.9：对3个变量按有小到大顺序排序，要求使用变量引用
 * ***********************************************/
void exercise9(int& a, int& b, int& c)
{
    if (a > b) {
        int temp = a;
        a = b;
        b = temp;
    } // a <= b
    if (c <= a) {
        cout << c << " " << a << " " << b << endl;
    } else if (c <= b) {
        cout << a << " " << c << " " << b << endl;
    } else {
        cout << a << " " << b << " " << c << endl;
    }
}

/*************************************************
 * 习题1.10:编写一个程序，将两个字符链接起来，
 * 取代第一个字符，要求用string实现
 * ***********************************************/
void exercise10()
{
    string str1, str2;
    cin >> str1 >> str2;
    str1 = str1 + str2;
    cout << str1 << endl;
}

/*************************************************
 * 习题1.11:编写一个程序，输入一个字符串，把其中的字符
 * 按照逆序输出，如输入：LIGHT，输出THGIL
 * ***********************************************/
void exercise11()
{
    string str1;
    cin >> str1;
    string str2(str1.rbegin(), str1.rend());
    // reverse(str1.begin(), str1.end()); 实现同样的效果
    cout << str2 << endl;
}

/*************************************************
 * 习题1.12：有5个字符串，要求对他们按照有小到大的顺序
 * 输出，用string的方法
 * ***********************************************/
void exercise12()
{
    string str1, str2, str3, str4, str5;
    cin >> str1 >> str2 >> str3 >> str4 >> str5;
    set<string> mySet;
    mySet.insert(str1);
    mySet.insert(str2);
    mySet.insert(str3);
    mySet.insert(str4);
    mySet.insert(str5);
    for (auto itr = mySet.begin(); itr != mySet.end(); itr++) {
        cout << *itr << endl;
    }
}

/*************************************************
 * 习题1.13：用函数重载的方法实现一个函数，对参数为
 * 整型，单精度和双精度的数据进行排序
 * ***********************************************/
void sortInt(int arr[], int len)
{
    set<int>mySet;
    for (int i = 0; i<len; i++) {
        mySet.insert(arr[i]);
    }
    for (auto itr = mySet.begin(); itr != mySet.end(); itr++) {
        cout << *itr << endl;
    }
}
void sortFloat(float arr[], int len)
{
    set<float>mySet;
    for (int i = 0; i<len; i++) {
        mySet.insert(arr[i]);
    }
    for (auto itr = mySet.begin(); itr != mySet.end(); itr++) {
        cout << *itr << endl;
    }
}
void sortDouble(double arr[], int len)
{
    set<double>mySet;
    for (int i = 0; i<len; i++) {
        mySet.insert(arr[i]);
    }
    for (auto itr = mySet.begin(); itr != mySet.end(); itr++) {
        cout << *itr << endl;
    }
}
void exercise13()
{ }

/*************************************************
 * 习题1.14：用函数模板的方式，实现13题
 * ***********************************************/
template<typename type>
type sortType(type arr[], int len)
{
    set<type>mySet;
    for (int i = 0; i<len; i++) {
        mySet.insert(arr[i]);
    }
    for (auto itr = mySet.begin(); itr != mySet.end(); itr++) {
        cout << *itr << endl;
    }
}
void exercise14()
{ }

int main()
{
    int arr[] = {3, 2, 9, 4, 7};
    sortType(arr, 5);
    return 0;
}